package com.itheima.reggie.controller;


import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.itheima.reggie.common.R;
import com.itheima.reggie.entity.User;
import com.itheima.reggie.service.UserService;
import com.itheima.reggie.utils.ValidateCodeUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpSession;
import java.util.Map;
import java.util.concurrent.TimeUnit;

@RestController
@Slf4j
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService;
    @Autowired
    private RedisTemplate redisTemplate;

    @PostMapping("sendMsg")
    public R<String> sendMsg(@RequestBody User user, HttpSession session ){
        //获取前端传来手机号
        String phone = user.getPhone();
        //判断 号码 不为空, 则生成 验证码
        if (StringUtils.isNotEmpty(phone)){
            //此为生成验证码操作,和工具包挂钩
            String code = ValidateCodeUtils.generateValidateCode(4).toString();
             log.info("我们给用户发的验证码是::"+code);
             //发送操作 姑且不谈
 /*
            String signName = "传智健康项目基手机号登录";
            String templateCode = "SMS_175532136";
            // 通过阿里云给 指定的手机 发生指定签名+模板的验证码
            //循环 定时器 一分钟发一次
            SMSUtils.sendMessage(signName,templateCode,phone,code+"");
          */
 //       因为后续登录业务 需要对验证码进行校验,,所以要先将验证码写入  session域中
        // 不往域中存     session.setAttribute(phone,code);
            //
            redisTemplate.opsForValue().set(phone,code,5, TimeUnit.MINUTES);

          return R.success("手机验证码发送成功,请查收");


        }
        return R.error("验证码发送失败");

    }
    @PostMapping("/login")
    public R<String>login01(@RequestBody Map map,HttpSession session){
        //获取用户录入的 手机号
        String phone = map.get("phone").toString();
        // 获取用户录入的验证码
        String code = map.get("code").toString();
        //获取刚刚session域中存入的 验证码
      //  String codeInSession = session.getAttribute(phone).toString();
        //拿到了 域中的  和 用户的 比较

        //获取在 redis中的  phone  和  code
        String codeInSession = redisTemplate.opsForValue().get(phone).toString();
        log.info("从redis中获取的验证码?",codeInSession);

        if (codeInSession!=null&&codeInSession.equals(code)){
             redisTemplate.delete(phone);
            //判断为true后  证明 用户登录成功了
            //如果用户是第一次登录,  那就是 注册 操作   所以会有添加业务的涉及
            //1: 先查看数据库是否有 该手机号
            LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
            wrapper.eq(User::getPhone,phone);
            //查询用户表 是否有该用户手机号
            User one = userService.getOne(wrapper);
            //再做判断 .  如果没有  那就是 第一次登录  即为注册  要做添加操作
            if (one==null){
                one=new User();
                one.setPhone(phone);
                one.setStatus(1);
                //保存
                userService.save(one);
            }
            //  这里再次将 用户id存到 域中  方便后面的 权限校验
            session.setAttribute("user",one.getId());   //存的是用户的id
            //返回给前端   用户的信息
            return R.success("登陆成功");

        }
        return R.error("验证码有误,登陆失败");
    }
}
